Page de mes tutoriels
Comment cracker SteelthPE 2.2


image

Dans ce cours, nous allons voir comment passer un logiciel qui se fait passer pour une démo en version complète. Ce soft est un petit packer qui peut être assez utile, même si il y en a des plus performants… Pour avoir les bases sur l'unpacking et les packers, je vous conseille de vous reportez à mon premier tuto sur Anti007 2.5 (ce n'est pas obligatoire, car ce n'est pas l'objet exact du tuto). Nous allons ici apprendre à supprimer un Nag, débloquer une fonction, virer un timer et enlever un "demo" dans la barre de titre. Si vous en avez envie, vous pourrez même créer votre crack pour ce soft.

Je rappelle que je ne peux en AUCUN CAS être tenu pour responsable d'un dommage survenant sur votre PC lors de la mise en pratique de ce tuto.


image

Prérequis :

Vous aurez besoin de connaître le fonctionnement d'OllyDbg, et d'avoir des connnaissances en assembleur, sinon vous n'irez pas très loin.


Voici une introduction à OllyDbg par Crisanar : ./tutos/archives/Crisanar/introOlly.html


Pour l'assembleur, j'ai sélectionné deux cours très bien faits, accessibles aux débutants mais proposant tout de même une approche assez complète.

Cours de Deamon : ./tutos/archives/deamoncrack/cours0.html

Cours de Falcon : ./tutos/archives/pifoman/html/cours_cracking/cours_assembleur.htm


Normalement vous n'avez besoin de rien de plus.

image


Outils :

  • StealthPE 2.2 (dans l'archive)

  • Peid 0.95 ou RDG Packer Detector 0.6.6 (au choix)

  • Un débuggeur/désassembleur : OllyDbg (1.10 ou 2.0)

  • Un éditeur hexadécimal

  • Tola's Patching Engine 2.03 (dans l'archive)

  • Un cerveau :)


Les anciennes versions des logiciels proposés (Peid / RDG / TPE) marchent également. Pour Olly, je l'ai fait avec la version 1.10. Tout ces logiciels sont trouvables rapidement dans Google.


image


Introduction


Commençons d'abord par observer le soft pour savoir quels sont ses limitations. Après quelques minutes d'utilisation, il en ressort ceci :

  • Nagcreen au démarrage qui demande d'acheter la version complète

  • L'option "Crypt Sections" est bloquée, une messagebox nous avertit que ce n'est pas disponible

  • dans la démo. (En fait si, vous verrez… :)

  • Timer de 10 secondes avant de pouvoir protéger un exe

  • Un petit "demo" dans la barre de titre.

Voilà, je crois qu'on a fait le tour de ce que l'on peut modifier. J'espère que vous avez bien noté les messages qu'on a eu avec les messagesbox.


Pour des compléments sur les démos, je cite Frog's Print :


Les logiciels de démonstrations ont certaines de leurs fonctions désactivées (Sauver, Copier/coller, Imprimer...) et elles ne sont disponibles que dans la version commerciale.

Contrairement aux Sharewares qui, eux-aussi, ont des fonctions désactivées, les logiciels de démonstrations ne peuvent pas être débridés par un sérial.


Ce type de protection est tout à fait intéressante à nos yeux, car nous devons voir si, bien qu'elles aient été désactivées, ces fonctions sont présentes dans le programme ou les DLLs qui l'accompagnent. Si elles y sont, il faudra trouver le moyen de les ré-activer, sinon... il faudra les ré-écrire (entièrement ou en partie). Et c'est bien là que ça devient intéressant: il faudra utiliser toute nos connaissances pour savoir ce qu'il manque, trouver la place à l'intérieur du programme pour y placer notre code (en pur ASM) etc...

C'est ce qu'on appelle le Reverse Engineering (traduisez : Renverser le sens de la machine).


Il faut étudier l'aspect commercial du problème:

Ecrire un programme puis le distribuer ça coûte de l'argent. Ecrire une version de démonstration bridée et une version commerciale puis distribuer les 2, ça coûte 2 fois plus cher. Par conséquent, la solution la plus économique serait de n'écrire qu'un seul programme puis d'y faire une toute petite modification (changer un Call en Nop ou un Jnz en Jmp...) pour le tourner en version démo ou commerciale.

Et les programmeurs/distributeurs qui s'en sont aperçus bien avant vous, ont bien évidemment opté pour cette solution. En fait, il écrivent une version qui contient à la fois l'intégralité des fonctions de la version commerciale mais aussi les differents nagscreens, et messages du genre "This function is unavailable in the demo version..." de la version de démonstration.

Puis ils patchent très simplement leur programme:

  • ils désactivent certaines fonctions pour en faire une Démo

  • ils désactivent les nagscreens... pour en faire une version commerciale.


Donc, pour résumer la chose, 90% de ces logiciels peuvent être transformer en versions 100% fonctionnelles sans trop de peine.


// Fin de la longue citation. Je crois qu'il n'y a rien à rajouter :). Vous avez je pense compris ce que l'on va faire sur cette pseudo-demo.


Info : Non le dump n'est pas packé avec UPX, si vous êtes tentés de l'analyser d'abord avec Peid. Chargez le dans Olly, et vous verrez.


Cracking de StealthPE 2.2


Chargez le dump dans Olly, faites un click droit, Search for, All referenced text strings

pour partir à la recherche du message d'erreur. On a de la chance, ils sont juste au dessus de notre PUSH EBP. Double-cliquez sur la première string

, celle du nag de départ, pour arriver à l'endroit ou se situe le message d'erreur.


image

Vous arrivez normalement ici :


Placez un Bp (F2) sur le PUSH EBX en 00479FD4. Faites ensuite F9. Olly breake, on va donc tracer ensuite en faisant F8 pour voir comment (et quand) s'affiche le nag. Le nag apparaît dans le premier CALL en 00479FDC, juste après l'instruction MOV qui met notre string dans EAX. On remarque que le programme s'arrête sur ce CALL tant que nous ne cliquons pas sur "OK". Or, cliquez sur OK, et le programme passe à l'instruction suivante, le MOV DL, 1, et le nag a disparu.


Solution : Retournez sur le MOV EBX, EAX, faites espace, et dans la fenêtre "Assemble" écrivez JMP 00479FE1. Pourquoi? Parce que le nag est appelé par le 1er CALL, et disparaît à l'instruction suivante. Si l'on saute les trois instructions relatives à l'affichage du nag (MOV + MOV + CALL) pour passer directement à la routine du CALL suivant, le soft fera comme si le nag n'avait jamais existé :). Et une protection en moins.


image


Pour sauvegarder le changement, sélectionnez la ligne avec le JMP que l'on vient de rajouter, faites "Copy to executable", "Selection". Faites ensuite un click droit dans la fenêtre qui apparaît et faites "Save File". Cette méthode est malgré tout fastidieuse, car vous devrez sélectionnez à chaque fois toutes les modifications que vous avez faites pour sauver, ou alors mettre "Copy all" sans avoir exécuté le programme. Utilisez plutôt un éditeur hexadécimal si vous débuggez en même temps, et remplacez 8BD8 par EB0A.


Retournez dans les strings, et cette fois ci double-cliquez sur la 2e . Vous arrivez ici :


image

Placez un BP sur le PUSH EBX en 0047A0B3, pour que l'on puisse examiner tout ce qui se passe dans cette routine, qui je le rappelle nous affiche un message qui nous dit que l'option "Crypt Sections" n'est pas disponible dans la démo. Faites ensuite F9 pour que le programme finisse de se charger, et tentez de cocher la case "Crypt sections". Olly breake, traçons alors avec F8.

On arrive au TEST AL, AL en 0047A0C9, et que voit on ? AL est à 1, ce qui fait que le JE ne sautera pas. Mince alors ! On se retrouve avec le nag.


Solution : On va modifier le JE de façon à ce qu'il saute tout le temps la routine d'affichage de la messagebox. Allez donc sur le JE, faites espace pour avoir la fenêtre "Assemble", et remplacez le par un JMP en 0047A0E7. Vous avez donc maintenant ceci :


image


Faites F9, et le soft nous a bien gentiment coché l'option qui était soit disant indisponible :). Enregistrez la modification avec Olly, sinon remplacez 740A PAR EB1A dans l'éditeur hexa.


Pour la troisième modification, on va se contenter d'enlever le "demo" dans la barre de titre, car il n'aura bientôt plus lieu d'être. Si vous recherchez avec un éditeur hexadécimal, allez à loffset 927A0 (dans WinHex). On va chercher ici dans Olly. Il faut pour cela que vous ayez laissez l'analyse du programme se faire, Si ce n'est pas le cas, click droit, Analysis, Analyse code. Retournez donc encore une fois dans les strings, et cherchez y cette fois ci le texte "demo". Faites Ctrl+L jusqu'à ce que vous arriviez à cette string : "Stealth PE 2.2 D" en 00492799. On remarque à la ligne en dessous la fin de la string : "emo".

C'est bon, vous avez ce qu'il vous faut. Sélectionnez les deux lignes, faites Follow in Dump, Selection. On arrive ici :


image

Maintenant, sélectionnez le mot "Demo", faites click droit, Binary, Fill with 00's pour remplacer par des 00. Vous pouvez aussi juste mettre un 00 à la place du "D", et le programme croira que la string est finie. Mais bon, je n'aime pas laisser les choses à moitié faites.

Vous obtenez ceci :


image


Pour sauvegardez dans Olly, faites comme précedemment (Sauvegardez dans la fenêtre CPU, pas dans le dump !).


Dernière modification pour obtenir la version complète : supprimer le timer de 10 secondes. N'oubliez pas : 10d = 0Ah

Retournons (encore une fois :) dans les strings. Je ne sais pas vous, mais moi j'ai tout de suite remarqué que juste en dessous de nos messages d'erreur, on avait deux strings nommées "Load EXE" et "Wait", ce qui correspond aux deux textes affichés sur le bouton. Double-cliquons sur la première. Vous arrivez ici :


image


Examinons maintenant ce qui se passe. Il ya a trois instructions intéressantes : 0047A12C DEC DWORD PTR DS:[47E0AC] // Décrémente la valeur en 0047E0AC 0047A132 CMP DWORD PTR DS:[47E0AC],1 // Compare cette même valeur à 1 0047A139 JGE SHORT DUMP_.0047A15A // Saute si supérieur ou égal à 1.


Or, où nous emmène ce JGE ? Sur le "Wait" ! Si l'on supprime ce saut, on aura donc "Load EXE" d'affiché au lancement du programme. Cela peut paraître séduisant du premier coup, mais si vous essayez, vous verrez que vous ne pourrez plus rien ouvrir. On va donc tester autre chose. Prenez votre programme non patché, placez un BP sur l'instruction DEC, et faites F9. Le programme breake après que l'on ait quitté le nag. Or, on remarque une chose très intéressante :


image

La valeur stockée en 0047E0AC est en effet égale à 10. (Rappelez vous : 0Ah = 10d). Ce n'est pas le nombre de secondes que notre timer contient à son initialisation ? Continuez à débugger encore un petit peu et vous vous apercevez que la valeur passe à 9, et que le programme saute en conséquence vers "Wait". Gardez le BP sur le DEC, est faites ensuite F9 en gardant à l'œil la valeur contenue dans l'adresse. Elle passe ainsi de 9 à 8, puis de 8 à 7, et ainsi de suite jusqu'à ce que la valeur soit égale à 1, ce qui la fait passer à 0, et ainsi le JGE ne saute plus. Allons maintenant voir ce qui se passe à cette adresse. Faites Ctrl+F2 pour redémarrez le programme, gardez encore le BP sur le DEC, et allez dans la fenêtre de dump. Faites click droit, Go to, Expression et entrez l'adresse 0047E0AC. La valeur est d'abord à 0, mais quand on fait F9, elle passe à 0A. Il y a deux façon de trouver où se fait le changement de valeur :


image


  • Faites Ctrl+F2, allez dans la fenêtre de dump, cherchez notre adresse 0047E0AC, click droit sur le

  • premier octet, Breakpoint, Memory on access.

  • Faites ensuite F9 et on breake directement sur la bonne instruction.


  • Il semblerait donc qu'une instruction est initialisée le timer en passant la valeur

  • de notre adresse de 00 à 0A. Quelle instruction permet de placer une valeur dans une adresse mémoire?

  • Le MOV, bien sûr ! Cherchons alors un MOV DWORD PTR DS:[0047E0AC], 0A dans Olly.

  • Faites click droit, Search for, Command, et mettez notre instruction. Faites entrée et on aterrit ici :


image


Comme par hasard, on se retrouve dans la routine d'affichage de notre programme, après l'affichage du nag. On va donc initialiser le timer à 0, parce qu'on n'aime pas attendre :). Faites espace sur l'instruction, et dans la fenêtre assemble mettez MOV DWORD PTR DS:[0047E0AC], 00.


image


C'est bon, enregistrez les modifications sur le fichier patché, et vous avez fini de cracké le programme :).


Pour faire le crack, vous ouvrez TPE, dans "General" mettez la description de votre crack, dans "Patch data" vous définissez le fichier original et le cracké, et dans "Customize" vous pouvez le

personnaliser. Une fois que c'est fait, faites "File", "Create Patch", et votre crack est créé ! Vous pouvez le diffuser si l'envie vous prend…


Voilà comment faire passer une démo en version complète, bon je reconnais que celle là était facile, mais c'est pour vous montrer que ce n'est pas parce que c'est une démo que l'on ne peut pas s'en occuper. Maintenant vous êtes au courant :)


image


Ce tutoriel est fini. J'espère qu'il a été clair, et que vous n'avez pas rencontré de difficultés. Tuto finalisé par Horgh le 21/02/2010


Merci à :

Joker_Italy, pour ses superbes tutos sur l'unpacking manuel Frog's Print, pour ses tutos qui m'ont bien fait rire…

Aux auteurs du soft, qui ne se sont pas foulés :)

Copyright (C)- xtx Team (2021)

XHTML valide 1.1 CSS Valide !